﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace BDSim
{
    public class CMatrixDLL
    {
        //////////////////////////////////////////////////////////
        //函数名称：MatrixInitial
        //函数功能：将矩阵初始化，矩阵元素全部赋值为0
        //输入：
        //      *M：矩阵的首元素地址;
        //       n：矩阵元素个数;
        //输出：
        //      元素全部为0的矩阵
        //返回值：无
        /////////////////////////////////////////////////////////
        [DllImport("CMatrixDLL.dll", EntryPoint = "MatrixInitial", CallingConvention = CallingConvention.Cdecl)]
        public static extern void MatrixInitial(double[] M, int n);//矩阵初始化，矩阵元素全部赋值为0; 

        //////////////////////////////////////////////////////////
        //函数名称：MatrixMult
        //函数功能：计算两个矩阵M1，M2相乘
        //输入：
        //      *M1:相乘的第一个矩阵的地址 (m×n)
        //      *M2:相乘的第二个矩阵的地址 (n×p)
        //输出：
        //      *M3:相乘后的矩阵的地址M3=M1×M2 (m×p)
        //返回值：无
        /////////////////////////////////////////////////////////
        [DllImport("CMatrixDLL.dll", EntryPoint = "MatrixMult", CallingConvention = CallingConvention.Cdecl)]
        public static extern void MatrixMult(double[] M1,  double[] M2, double[] M3, int m, int n, int p);//两个矩阵相乘 

        //////////////////////////////////////////////////////////
        //函数名称：MatrixRotate
        //函数功能：计算旋转矩阵
        //输入：
        //       angel1,id1：第一次旋转的角度(度)以及所绕的轴
        //       angel2,id2：第二次旋转的角度(度)以及所绕的轴
        //       angel3,id3：第三次旋转的角度(度)以及所绕的轴
        //输出：
        //       R2[3][3]：按id1,id2,id3的顺序旋转的转换矩阵
        //返回值：无
        /////////////////////////////////////////////////////////
        [DllImport("CMatrixDLL.dll", EntryPoint = "MatrixRotate", CallingConvention = CallingConvention.Cdecl)]
        public static extern void MatrixRotate(double angle1, int id1, double angle2, int id2, double angle3, int id3, double[] P);//矩阵旋转 

        //////////////////////////////////////////////////////////
        //函数名称： MatrixTran
        //函数功能：计算矩阵转置
        //输入：
        //       M1：原始矩阵的地址 (m×n)
        //输出：
        //       M2：转置后矩阵的地址 (n×m)
        //返回值：无
        /////////////////////////////////////////////////////////
        [DllImport("CMatrixDLL.dll", EntryPoint = "MatrixTran", CallingConvention = CallingConvention.Cdecl)]
        public static extern void MatrixTran( double[] M1,   double[] M2, int m, int n);//矩阵转置 

        //////////////////////////////////////////////////////////
        //函数名称： MatrixInv
        //函数功能：高斯－约当法求逆矩阵
        //输入：
        //       *source：源矩阵的地址 (num×num)
        //输出：
        //       *x： 源矩阵逆矩阵 (num×num)
        //返回值：-1 or 0
        /////////////////////////////////////////////////////////
        [DllImport("CMatrixDLL.dll", EntryPoint = "MatrixInv", CallingConvention = CallingConvention.Cdecl)]
        public static extern int MatrixInv(  double[] source,  double[] x, int num);//高斯－约当法求逆矩阵

        //////////////////////////////////////////////////////////
        //函数名称： Matrix_inv2
        //函数功能：求逆矩阵
        //输入：
        //       *A：源矩阵的地址 (n×n)
        //        n: A矩阵阶数
        //       ep: 限定值
        //输出：
        //       *A：源矩阵逆矩阵地址 (n×n)
        //		 0 失败 or 1 成功
        /////////////////////////////////////////////////////////
        [DllImport("CMatrixDLL.dll", EntryPoint = "Matrix_inv2", CallingConvention = CallingConvention.Cdecl)]
        public static extern int Matrix_inv2( double[] A, int n, double ep);//矩阵求逆

        //////////////////////////////////////////////////////////
        //函数名称： MatrixAthwart
        //函数功能：矩阵求逆
        //输入：
        //       *MatrixInput：源矩阵的地址 (n×n)
        //输出：
        //       *MatrixOut：源矩阵逆矩阵 (n×n)
        //返回值：true or false
        /////////////////////////////////////////////////////////
        [DllImport("CMatrixDLL.dll", EntryPoint = "MatrixAthwart", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool MatrixAthwart( double[] MatrixInput,  double[] MatrixOut, int n);
    }
}
